﻿//#define TABLE_SIZE 5009
//#define MAX_POS 6000
//#define min(a,b) ((a) < (b) ? (a) : (b))
//typedef struct Binode {
//    int pos;
//    int count;
//    bool back;  
//}Binode;
//typedef struct queue {
//    Binode table[TABLE_SIZE];
//    int rear;
//    int front;
//}Queue;
//
//void enqueue(Queue* queue, Binode ele) {
//    queue->rear = (1 + queue->rear) % TABLE_SIZE;
//    queue->table[queue->rear] = ele;
//}
//
//Binode dequeue(Queue* queue) {
//    queue->front = (queue->front + 1) % TABLE_SIZE;
//    return queue->table[queue->front];
//}
//
//bool notemptyqueue(Queue* queue) {
//    return queue->rear != queue->front;
//}
//
//int minimumJumps(int* forbidden, int forbiddenSize, int a, int b, int x) {
//    bool visited[MAX_POS][2];
//    memset(visited, 0, sizeof(visited));
//
//    for (int i = 0; i < forbiddenSize; i++) {
//        visited[forbidden[i]][0] = true;
//        visited[forbidden[i]][1] = true;
//    }
//    Queue queue;
//    memset(&queue, 0, sizeof(queue));
//    Binode ele0;
//    ele0.pos = 0; ele0.count = 0; ele0.back = false;
//    enqueue(&queue, ele0);
//
//    while (notemptyqueue(&queue)) {
//        Binode ele = dequeue(&queue);
//        if (ele.pos == x)
//            return ele.count;
//        // 向前跳
//        if (ele.pos + a < MAX_POS && !visited[ele.pos + a][0]) {
//            Binode temp;
//            temp.pos = ele.pos + a;
//            temp.count = ele.count + 1;
//            temp.back = false;
//            visited[temp.pos][0] = true;
//            enqueue(&queue, temp);
//        }
//        // 向后跳
//        if (!ele.back && ele.pos - b > 0 && !visited[ele.pos - b][1]) {
//            Binode temp;
//            temp.pos = ele.pos - b;
//            temp.count = ele.count + 1;
//            temp.back = true;
//            visited[temp.pos][1] = true;
//            enqueue(&queue, temp);
//        }
//    }
//    return -1;
//}